/******************************************************************************* * Copyright (c) 2012-2017 Codenvy, S.A. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Codenvy, S.A. - initial API and implementation *******************************************************************************/ package org.eclipse.che.rmi; import javax.naming.Context; import java.rmi.AlreadyBoundException; import java.rmi.Remote; import java.rmi.RemoteException; import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; import java.rmi.server.ExportException; import java.rmi.server.UnicastRemoteObject; import java.util.Random; /** * @author Evgen Vidolob */ public class RmiServer { private static Remote remote; protected static void start(Remote remote) throws RemoteException { System.setProperty("java.rmi.server.hostname", "localhost"); System.setProperty("java.rmi.server.disableHttp", "true"); System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.eclipse.che.rmi.JNDI"); if (RmiServer.remote != null) { throw new AssertionError("This server is already started!"); } RmiServer.remote = remote; int port = -1; Random random = new Random(); Registry registry = null; while (port == -1) { int tmpPort = random.nextInt(65535); if (tmpPort < 4000) { continue; } try { registry = LocateRegistry.createRegistry(tmpPort); port = tmpPort; } catch (ExportException ignored) { } } Remote exportObject = UnicastRemoteObject.exportObject(remote, port); String exportName = remote.getClass().getSimpleName() + Integer.toHexString(exportObject.hashCode()); try { registry.bind(exportName, exportObject); String portName = port + "/" + exportName; System.out.println("Port/Name:" + portName); int twoMinutes = 2 * 60 * 1000; Object lock = new Object(); while(true){ synchronized (lock){ lock.wait(twoMinutes); } // TODO add ping } } catch (AlreadyBoundException | InterruptedException e) { e.printStackTrace(); System.exit(42); } } }